package pos.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import pos.domain.*;

public class JDBCCalleDAO implements ICalleDAO {

	Connection conn = ConnectionManager.getInstance().getConn();

	@Override
	public Calle selectByNombre(String nombreCalle) {
		PreparedStatement stmt = null;
		ResultSet result = null;
		Calle c = null;
		String nombre = "%" + nombreCalle + "%";
		nombre = nombre.replace(" ", "%");
		String sql = "SELECT * FROM calle WHERE nombre like ?";
		JDBCIncidenciaDAO incidenciaDao = new JDBCIncidenciaDAO();
		List<Incidencia> incidencias = new ArrayList<Incidencia>();
		List<Estacion> estaciones = new ArrayList<Estacion>();
		JDBCBarrioDAO barrioDAO = new JDBCBarrioDAO();

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, nombre);
			result = stmt.executeQuery();

			if (result.next()) {
				c = new Calle();
				c.setNombre(result.getString("nombre"));
				c.setIdCalle(result.getInt("idCalle"));
				incidencias = incidenciaDao.selectByCalle(c);
				c.setIncidencias(incidencias);
				estaciones = selectEstacionesCercanas(c);
				c.setEstaciones(estaciones);
				c.setBarrio(barrioDAO.selectById(result.getInt("idBarrio")));
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return c;
	}

	public void insert(Calle c) {
		String sql = "INSERT INTO calle ( nombre,idBarrio) VALUES (?,?) ";
		PreparedStatement stmt = null;
		try {
			String nombre = c.getNombre();
			nombre = nombre.replace("ñ", "�");
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, nombre);
			stmt.setInt(2, c.getBarrio().getIdBarrio());
			stmt.executeUpdate();

		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
	}

	@Override
	public Calle selectByID(int id) {
		PreparedStatement stmt = null;
		ResultSet result = null;
		Calle c = null;
		String sql = "SELECT * FROM calle WHERE (idCalle = ?) ";
		JDBCIncidenciaDAO incidenciaDao = new JDBCIncidenciaDAO();
		List<Incidencia> incidencias = new ArrayList<Incidencia>();
		List<Estacion> estaciones = new ArrayList<Estacion>();
		JDBCBarrioDAO barrioDAO = new JDBCBarrioDAO();

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, id);
			result = stmt.executeQuery();

			if (result.next()) {
				c = new Calle();
				c.setNombre(result.getString("nombre"));
				c.setIdCalle(result.getInt("idCalle"));
				incidencias = incidenciaDao.selectByCalle(c);
				c.setIncidencias(incidencias);
				estaciones = selectEstacionesCercanas(c);
				c.setEstaciones(estaciones);
				c.setBarrio(barrioDAO.selectById(result.getInt("idBarrio")));
			}

		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return c;
	}

	@Override
	public List<Estacion> selectEstacionesCercanas(Calle calle) {
		PreparedStatement stmt = null;
		ResultSet result = null;
		Estacion est = null;
		String sql = "SELECT * FROM calleestacion WHERE idCalle = ?";
		List<Estacion> lista = new ArrayList<Estacion>();
		JDBCEstacionDAO estacionDAO = new JDBCEstacionDAO();
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, calle.getIdCalle());
			result = stmt.executeQuery();

			while (result.next()) {
				est = new Estacion();
				est = estacionDAO.selectByNumero(result
						.getInt("idEstacionSevici"));
				lista.add(est);
			}

		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return lista;
	}

	@Override
	public List<Calle> selectAllCalles() {
		PreparedStatement stmt = null;
		ResultSet result = null;
		Calle c = null;
		String sql = "SELECT * FROM calle";
		List<Calle> lista = new ArrayList<Calle>();
		JDBCIncidenciaDAO incidenciaDao = new JDBCIncidenciaDAO();
		List<Incidencia> incidencias = new ArrayList<Incidencia>();
		List<Estacion> estaciones = new ArrayList<Estacion>();
		JDBCBarrioDAO barrioDAO = new JDBCBarrioDAO();

		try {
			stmt = conn.prepareStatement(sql);
			result = stmt.executeQuery();

			while (result.next()) {
				c = new Calle();
				c.setNombre(result.getString("nombre"));
				c.setIdCalle(result.getInt("idCalle"));
				incidencias = incidenciaDao.selectByCalle(c);
				c.setIncidencias(incidencias);
				estaciones = selectEstacionesCercanas(c);
				c.setEstaciones(estaciones);
				c.setBarrio(barrioDAO.selectById(result.getInt("idBarrio")));
				lista.add(c);
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return lista;
	}

	@Override
	public List<Calle> selectListByNombre(String nombreCalle) {
		PreparedStatement stmt = null;
		ResultSet result = null;
		Calle c = null;
		String nombre = nombreCalle + "%";
		String sql = "SELECT * FROM calle WHERE nombre like ?";
		List<Calle> lista = new ArrayList<Calle>();
		JDBCIncidenciaDAO incidenciaDao = new JDBCIncidenciaDAO();
		List<Incidencia> incidencias = new ArrayList<Incidencia>();
		List<Estacion> estaciones = new ArrayList<Estacion>();

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, nombre);
			result = stmt.executeQuery();

			while (result.next()) {
				c = new Calle();
				c.setNombre(result.getString("nombre"));
				c.setIdCalle(result.getInt("idCalle"));
				incidencias = incidenciaDao.selectByCalle(c);
				c.setIncidencias(incidencias);
				estaciones = selectEstacionesCercanas(c);
				c.setEstaciones(estaciones);
				lista.add(c);
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return lista;
	}

	@Override
	public Calle selectCalleByBarrio(Barrio barrio) {
		PreparedStatement stmt = null;
		ResultSet result = null;
		Calle c = null;
		String sql = "SELECT * FROM calle WHERE idBarrio =? ORDER BY rand() LIMIT 1 ";
		JDBCIncidenciaDAO incidenciaDao = new JDBCIncidenciaDAO();
		List<Incidencia> incidencias = new ArrayList<Incidencia>();
		List<Estacion> estaciones = new ArrayList<Estacion>();
		JDBCBarrioDAO barrioDAO = new JDBCBarrioDAO();

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, barrio.getIdBarrio());
			result = stmt.executeQuery();

			if (result.next()) {
				c = new Calle();
				c.setNombre(result.getString("nombre"));
				c.setIdCalle(result.getInt("idCalle"));
				incidencias = incidenciaDao.selectByCalle(c);
				c.setIncidencias(incidencias);
				estaciones = selectEstacionesCercanas(c);
				c.setEstaciones(estaciones);
				c.setBarrio(barrioDAO.selectById(result.getInt("idBarrio")));
			}

		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return c;
	}
}
